#!/usr/bin/env python
# -*- coding:utf8 -*-
"""
Author : mafei
@Date   : 2019/12/02

"""

import coreapi
import coreschema

# 除了这个基类, 还有 AssetViewBase 和 CacheViewBase 可以选用
# 具体区别可以看类的定义来进行了解
from .base import ViewBase  # class-based view 基类


class MyExampleView(ViewBase):

    # required_*_keys 方法目前只是对之前的 required_keys 做了兼容的情况下进行了拆分
    # 如果有校验需求, 按照需求定义这个列表就好, 不需要不用写
    # !!! 这里的缺陷是, 虽然区分了 required_keys, 但是并没有区分方法, 也就是无论什么方法都会对定义了的列表进行校验

    # querystring 必需有的参数, 定义一个列表, 包含必需有的参数名字
    required_query_keys = []

    # body 必需有的参数
    required_body_keys = []

    # 定义 POST 方法要用到的参数, 元祖或者列表都可以
    # 目前这里还是只起到了定义的作用, 没有校验

    # 目前的情况是, 如果要用这个东西来自动化生成简易文档的话,
    # 就不太适合用于做参数校验(比如生成文档的时候它不支持定义 Object, 但是我们实际上可能是要使用的)

    post_fields = (
        coreapi.Field(
            name='name',  # 参数的名称
            location='form',  # 这个参数应该通过 request body 来传递, 值为 form 是使用到的框架定义的枚举值
            description=u'这个参数的简短描述',
            required=True,  # 这个参数是必需的
            # 这个字段是 string 类型, coreschema 里也有 Array, Object 这类复杂类型, 但是看源代码, 目前不支持这些复杂的类型生成文档
            # 所以如果要定义复杂的输入格式, 目前建议是写 docstring, 支持 html 标签, 可以直接使用 <pre> 标签
            schema=coreschema.String(),
        ),  # 如果要用元祖, 不要忘了最后这个逗号
    )

    def post(self, request):
        '''
        第一个参数是 request 对象
        :param request:
        :return:
        '''

        # 从 request body 中获取一个 string 类型的参数
        # 可以通过额外的参数传递默认值, 或者是设置是否允许为空字符串之类的, 具体请查阅 `custom_request.py`
        name = request.bget_string('name')
        age = request.bget_int('age')

        # 对参数做一些额外的规则校验
        # 比如是否满足特定正则, 或者能查找到数据库记录之类的
        # if not do_some_check_with(name):
        #    # 如果不满足规则, 返回一个参数类的错误响应
        #    # #!!! 不推荐返回  <名称不符合格式> 这种描述比较宽泛的错误, 可以尝试告知应该符合什么样的规则, 这样子有利于使用者根据错误描述来修正自己的输入
        #    return self.invalid_param_response(u'名称不符合格式')

        # 执行一些业务逻辑
        # 如果能够完成, 返回ok
        # if logic_ok():
        #     # 取决于需要, 是否需要返回的时候指定 data
        #     return self.ok_response()

        return self.ok_response(data={
            'name': name,
            'age': age
        })